package com.security.utils;



import com.security.config.MyException;
import com.security.domian.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.util.ObjectUtils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * JWT工具类
 */
public class JWTUtil {


    //设置秘钥，也可以在yml中设置
    public static String secret="weifeng@1216826729cc.";

    //设置token过期时间, 设一天：秒      毫秒
    public static long expr=3600*24*1000;

    public static long oneHours=3600*1000;


    //1.生成token, 用户信息user
    public static String sign(User user)
    {
        //指定的算法
        SignatureAlgorithm signature=SignatureAlgorithm.HS512;
        //生成token时间
        long nowMillis=System.currentTimeMillis();
        //转成日期类型
        Date date=new Date(nowMillis);

//        创建一些token可能需要存放的数据
        Map<String,Object> claims=new HashMap<>();
        claims.put("id",user.getId());
        claims.put("username",user.getUserName());

        //生成签发人
        String subject=user.getUserName();

        JwtBuilder jwtBuilder= Jwts.builder()
                .setClaims(claims)
                .setId(UUID.randomUUID().toString())
                .setIssuedAt(date)         //上面的生成日期
                .setSubject(subject)
                .signWith(signature,secret);

//        设置过期时间，用于验证用户浏览时是否登录过期
        Date outDate=new Date(nowMillis+expr);
        jwtBuilder.setExpiration(outDate);

        return jwtBuilder.compact(); //返回一个生成token后的字符串


    }






    //2.验证token是否正确，该方法一般由拦截器调用
    public static boolean verify(String token)
    {

        try {
            //判空
            if (ObjectUtils.isEmpty(token)) { return false; }

            ////token不为空则看这段代码是否正确，不正确则try-catch，否则return true;  固定写法
            Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
            return true;

        }catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }


    //3.获取用户信息
    public static User getUser(String token)
    {
        //判空  token空则抛出
        if (ObjectUtils.isEmpty(token)) {
            throw new MyException();
        }

//        如果token不正确则扔掉,正确则继续执行
        if (verify(token))
        {
           Claims claims= Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
//           获取用户信息
            User user=new User();
            user.setId(Integer.parseInt(claims.get("id")+""));
            user.setUserName(claims.get("username")+"");
            return user;


        }else {
            throw new MyException("超时或token不合法");
        }

    }


    public static void main(String[] args) {


//        C:\Users\Administrator\Desktop\资料\资料\ZWFmusic
//        System.out.println(System.getProperty("user.dir") + System.getProperty("file.separator")
//                + "src\\main\\java\\com\\musics\\music"+System.getProperty("file.separator")+"image");
//        C:\Users\Administrator\Desktop\资料\资料\ZWFmusic\src\main\java\com\musics\music
//        MultipartFile.transferTo(args);

    }

}
